﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Reflection;

namespace Pittypat.Web
{
    /// <summary>
    /// 提供查找和加载程序集的方法。
    /// </summary>
    static class AssemblyHelper
    {
        private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger(typeof(AssemblyHelper));

        /// <summary>
        /// 使用程序集的名称查找程序集，如果程序集尚未加载，则从 bin 目录中尝试加载目标程序集。
        /// </summary>
        /// <param name="name">程序集名称，仅仅是最简单的名称，比如 Waln.Authority.Api。</param>
        /// <returns>目标程序集，如果没有找到，则返回 null。</returns>
        internal static Assembly FindAssembly(string name)
        {
            // 程序集完整名称的前缀，比如 "Waln.Authority.Api,"
            var namePrefix = name + ",";

            // 首先遍历已经加载到当前应用程序域中的程序集
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            foreach (var assembly in assemblies)
            {
                // 查找具有指定前缀的程序集，比较不区分大小写
                if (assembly.FullName.StartsWith(namePrefix, StringComparison.OrdinalIgnoreCase))
                {
                    return assembly;
                }
            }

            // 从 bin 目录的文件中加载
            try
            {
                return Assembly.LoadFrom(VirtualFile.MapPath(string.Format("~/bin/{0}.dll", name)));
            }
            catch (Exception exc)
            {
                // 加载文件失败
                Logger.Error(exc.Message, exc);

                return null;
            }
        }
    }
}
